package logica_de_negocio;

import java.io.File;
import java.io.IOException;
import java.util.HashSet;

import javax.swing.ImageIcon;

import comun.Imagen;
import logica_de_datos.GestorBD;

public class gestorImagen {

	private HashSet<Imagen> listaImagenes;
	final GestorBD objConversor = GestorBD.getInstance();

	public gestorImagen() {
		listaImagenes = new HashSet<Imagen>();
	}

	/**
	 * Coje todas la imagenes almacenadas en la base de datos.
	 * 
	 * @throws ClassNotFoundException
	 *             Se produce cuando no existe la base de datos.
	 */
	public void cargarDatos() throws ClassNotFoundException {
		objConversor.connect();
		listaImagenes = objConversor.listarImagenes();
		objConversor.disconnect();
	}

	/**
	 * Nos devuelve la imagen pedida.
	 * 
	 * @param id
	 *            Id de la iamgen que buscamos
	 * @return (Obj) Imagen.
	 * @throws ClassNotFoundException
	 *             Se produce cuando no se existe la base de datos.
	 */
	public Imagen getImagenFromId(int id) throws ClassNotFoundException {
		Imagen i = new Imagen();
		objConversor.connect();
		i = objConversor.getImagenFromId(id);
		objConversor.disconnect();
		return i;
	}

	public void anadirImagen(File f) throws IOException, excepAnadirDupli,
			ClassNotFoundException {

		cargarDatos();
		Imagen i = new Imagen();
		// TODO -ESTO
		i.setImg(new ImageIcon(objConversor.readImageFromFile(f.getPath())));

		if (listaImagenes.contains(i)) {
			excepAnadirDupli e = new excepAnadirDupli();
			e.setDes("Ya existe esa imagen en la base de datos");
			throw e;
		} else {
			objConversor.connect();
			objConversor.addImage(f);
			objConversor.disconnect();
		}
	}

	/**
	 * Lista todas las imagenes de la base de datos.
	 * 
	 * @return HashSet<Imagen> Con las imagenes.
	 * @throws ClassNotFoundException
	 *             Se produce cuando no existe la base de datos.
	 * @throws FaltanDatosEnLaBaseDeDatos
	 *             Se lanza cuando no existe datos en la base de datos.
	 */
	public HashSet<Imagen> getImganes() throws ClassNotFoundException,
			FaltanDatosEnLaBaseDeDatos {
		cargarDatos();

		if (listaImagenes.isEmpty()) {
			FaltanDatosEnLaBaseDeDatos f = new FaltanDatosEnLaBaseDeDatos();
			f.setFalta("Na hay imgenes guaradas");
			throw f;
		}
		return listaImagenes;
	}

	/**
	 * Nos indica si la base de datos tiene alguna imagen.
	 * 
	 * @return True si no hay datos almacenados.
	 * @throws ClassNotFoundException
	 *             Si no existe la base de datos.
	 */
	public boolean estaVacia() throws ClassNotFoundException {

		cargarDatos();

		return listaImagenes.isEmpty();
	}

	public boolean borrar(int id_i) throws ClassNotFoundException {

		objConversor.connect();
		objConversor.deleteImagen(id_i);
		objConversor.disconnect();

		cargarDatos();

		boolean borrado = true;

		for (Imagen i : listaImagenes) {
			if (i.getId() == id_i) {
				borrado = false;
			}
		}
		return borrado;
	}

	public boolean reset() throws ClassNotFoundException {// OK
		cargarDatos();
		ExcepDeleteOnCascade e = new ExcepDeleteOnCascade();
		e.setAceptado(true);
		for (Imagen i : listaImagenes) {

			borrar(i.getId());

		}
		cargarDatos();
		boolean dev = false;
		if (listaImagenes.isEmpty()) {
			dev = true;
		}
		return dev;
	}
}